package xc.src.线程同步;

public class SellTicket implements Runnable {
    //定义100张票
    private int tickets = 100;

    public int getTickets() {
        return tickets;
    }

    public void setTickets(int tickets) {
        this.tickets = tickets;
    }

    //判断票数大于0，则买票并告知窗口，卖了之后总数减一
    // 票没有了，有人问，则采用死循环让买票动作一直执行下去
    @Override
    public void run() {
        //相同票出现多次
//        while (true) {
//            //tickets==100
//            //t1,t2,t3
//            //假设t1线程抢到CPU执行权
//            if (tickets > 0) {
//                //通过sleep方法来模拟出票时间
//                try {
//                    Thread.sleep(100);
//                    //t1线程休息100毫秒
//                    //t2线程抢到了CPU的执行权，t2线程开始执行，执行到这里时t2线程休息100毫秒
//                    //假设t3线程抢到CPU执行权，t3线程就要开始执行，执行到这里时t3线程休息100毫秒
//                } catch (InterruptedException e) {
//                    throw new RuntimeException(e);
//                }
//                //假设线程按照顺序醒过来
//                //t1优先抢到CPU的执行权，在控制台输出窗口一正在出售第100张票
//                System.out.println(Thread.currentThread().getName() + "正在售出第" + tickets + "张票");
//                //t2抢到了CPU的执行权，在控制台输出窗口二正在出售第100张票
//                //t3抢到了CPU的执行权，在控制台输出窗口三正在出售第100张票
//                tickets--;
//                //如果该三个线程按照顺序来，这里就执行了三次tickets--的操作，最终票就变成了97张
//            }
//        }

        //出现了负数票的情况
        while (true) {
            //tickets==100
            //t1,t2,t3
            //假设t1线程抢到CPU执行权
            if (tickets > 0) {
                //通过sleep方法来模拟出票时间
                try {
                    Thread.sleep(100);
                    //t1线程休息100毫秒
                    //t2线程抢到了CPU的执行权，t2线程开始执行，执行到这里时t2线程休息100毫秒
                    //t3线程抢到CPU执行权，t3线程就要开始执行，执行到这里时t3线程休息100毫秒
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                //假设线程按照顺序醒过来
                //t1抢到了CPU的执行权，在控制台输出：窗口一正在出售第一张票
                //假设t1继续拥有CPU的执行权，就会执行tickets--的操作，tickets= 0;
                //假设t2抢到CPU的执行权，在控制台输出，窗口一正在出售第0张票
                //假设t2继续拥有CPU的执行权，就会执行tickets--的操作，tickets= -1;
                //假设t3抢到CPU的执行权，在控制台输出，窗口三正在出售第-1张票
                //假设t3继续拥有CPU的执行权，就会执行tickets--的操作，tickets= -2;

                System.out.println(Thread.currentThread().getName() + "正在售出第" + tickets + "张票");
                tickets--;
            }
        }
    }
}
//线程执行的随机性导致的